package com.bawei.caohao20240805.view.fragment

import android.content.Intent
import android.widget.SeekBar
import android.widget.SeekBar.OnSeekBarChangeListener
import android.widget.Toast
import androidx.lifecycle.Observer
import coil.load
import com.bawei.caohao20240805.MyApp
import com.bawei.caohao20240805.R
import com.bawei.caohao20240805.base.BaseFragment
import com.bawei.caohao20240805.databinding.FragmentTimeBinding
import com.bawei.caohao20240805.viewmodel.ZhiViewModel
import com.bawei.comm.model.util.RsaCoder
import com.blankj.utilcode.util.UriUtils
import com.ksyun.media.streamer.capture.CameraCapture
import com.ksyun.media.streamer.filter.imgtex.ImgBeautyProFilter
import com.ksyun.media.streamer.filter.imgtex.ImgFilterBase
import com.ksyun.media.streamer.kit.KSYStreamer
import com.ksyun.media.streamer.kit.StreamerConstants
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.MultipartBody
import okhttp3.RequestBody
import java.io.File


class TimeFragment : BaseFragment<ZhiViewModel,FragmentTimeBinding>(R.layout.fragment_time) {
    override fun dataObSer() {
        mViewModel.zhidata.observe(this, Observer {
            Toast.makeText(context, it.message, Toast.LENGTH_SHORT).show()
            if(it.liveData!=null){
                var split = it.liveData.liveRtmpUrl.split("pwd=")
                var encryptByPublicKey =
                    RsaCoder.encryptByPublicKey(RsaCoder.decryptByPublicKey(split[1]))
                mStreamer.url=split[0]+"pwd="+encryptByPublicKey.replace("/".toRegex(),"-").replace("\\+".toRegex(),"~")
                mStreamer.startStream()
            }
        })
    }

    override fun initView() {
        mSrmer()
        // 设置美颜类型
        // 设置美颜类型
        val filter: ImgFilterBase = ImgBeautyProFilter(mStreamer.glRender, context)
        mStreamer.imgTexFilterMgt.setFilter(filter)
// 设置美颜级别（首先判断是否支持，然后进行设置）
// 设置磨皮级别，范围0-1
// 设置美颜级别（首先判断是否支持，然后进行设置）
// 设置磨皮级别，范围0-1
        if (filter.isGrindRatioSupported) {
            filter.grindRatio = 0.6.toFloat()
        }
// 设置美白级别，范围0-1
// 设置美白级别，范围0-1
        if (filter.isWhitenRatioSupported) {
            filter.whitenRatio = 0.6.toFloat()
        }
// 设置红润级别，一般范围为0-1，BeautyPro为-1.0~1.0
// 设置红润级别，一般范围为0-1，BeautyPro为-1.0~1.0
        if (filter.isRuddyRatioSupported) {
            filter.ruddyRatio = -0.3.toFloat()
        }
        mDing.seek.setOnSeekBarChangeListener(object :OnSeekBarChangeListener{
            override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
                filter.whitenRatio= (progress*1.0/100).toFloat()
            }

            override fun onStartTrackingTouch(seekBar: SeekBar?) {
//                TODO("Not yet implemented")
            }

            override fun onStopTrackingTouch(seekBar: SeekBar?) {
//                TODO("Not yet implemented")
            }

        })
        mDing.seek2.setOnSeekBarChangeListener(object :OnSeekBarChangeListener{
            override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
                filter.grindRatio= (progress*1.0/100).toFloat()
            }

            override fun onStartTrackingTouch(seekBar: SeekBar?) {
//                TODO("Not yet implemented")
            }

            override fun onStopTrackingTouch(seekBar: SeekBar?) {
//                TODO("Not yet implemented")
            }

        })
        mDing.seek3.setOnSeekBarChangeListener(object :OnSeekBarChangeListener{
            override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
                filter.whitenRatio= (progress*1.0/100).toFloat()
            }

            override fun onStartTrackingTouch(seekBar: SeekBar?) {
//                TODO("Not yet implemented")
            }

            override fun onStopTrackingTouch(seekBar: SeekBar?) {
//                TODO("Not yet implemented")
            }

        })
        mDing.kai.setOnClickListener {
            var create = RequestBody.create("multipart/form-data".toMediaTypeOrNull(), file)
            var formData = MultipartBody.Part.createFormData("liveCoverImage", file.name, create)
            mViewModel.getzhi(MyApp.userId,MyApp.sessionId,101,"22","33",mDing.title.text.toString(),formData)
        }
        mDing.mei.setOnClickListener {

        }
        mDing.guan.setOnClickListener {
            Toast.makeText(context, "关播", Toast.LENGTH_SHORT).show()
            mStreamer.stopStream()
        }
        mDing.img.setOnClickListener {
            startActivityForResult(Intent(Intent.ACTION_PICK).apply {
                                                                    type="image/*"
            },100)
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if(requestCode==100&&data!=null){
            file=UriUtils.uri2File(data.data)
            mDing.img.load(data.data)
        }
    }
    lateinit var  file:File
    lateinit var mStreamer: KSYStreamer
    private fun mSrmer() {
//        11．集成金山云SDK
        // 创建KSYStreamer实例
        mStreamer =  KSYStreamer(context);
// 设置预览View
        mStreamer.setDisplayPreview(mDing.cameraPreview);
// 设置推流url（需要向相关人员申请，测试地址并不稳定！）
        mStreamer.setUrl("rtmp://mobile.kscvbu.cn/live/{streamName}");
// 设置预览分辨率, 当一边为0时，SDK会根据另一边及实际预览View的尺寸进行计算
        mStreamer.setPreviewResolution(480, 0);
// 设置推流分辨率，可以不同于预览分辨率（不应大于预览分辨率，否则推流会有画质损失）
        mStreamer.setTargetResolution(480, 0);
// 设置预览帧率
        mStreamer.setPreviewFps(15f);
// 设置推流帧率，当预览帧率大于推流帧率时，编码模块会自动丢帧以适应设定的推流帧率
        mStreamer.setTargetFps(15f);
// 设置视频码率，分别为初始平均码率、最高平均码率、最低平均码率，单位为kbps，另有setVideoBitrate接口，单位为bps
        mStreamer.setVideoKBitrate(600, 800, 400);
// 设置音频采样率
        mStreamer.setAudioSampleRate(44100);
// 设置音频码率，单位为kbps，另有setAudioBitrate接口，单位为bps
        mStreamer.setAudioKBitrate(48);
        /**
         * 设置编码模式(软编、硬编)，请根据白名单和系统版本来设置软硬编模式，不要全部设成软编或者硬编,白名单可以联系金山云商务:
         * StreamerConstants.ENCODE_METHOD_SOFTWARE
         * StreamerConstants.ENCODE_METHOD_HARDWARE
         */
        mStreamer.setEncodeMethod(StreamerConstants.ENCODE_METHOD_SOFTWARE);
// 设置屏幕的旋转角度，支持 0, 90, 180, 270
        mStreamer.setRotateDegrees(0);
// 设置开始预览使用前置还是后置摄像头
        mStreamer.setCameraFacing(CameraCapture.FACING_FRONT);
    }
    override fun onResume() {
        super.onResume()
        // 一般可以在onResume中开启摄像头预览
        mStreamer.startCameraPreview()
        // 调用KSYStreamer的onResume接口
        mStreamer.onResume()
        // 如果onPause中切到了DummyAudio模块，可以在此恢复
        mStreamer.setUseDummyAudioCapture(false)
    }

    override fun onPause() {
        super.onPause()
        mStreamer.onPause()
        // 一般在这里停止摄像头采集
        mStreamer.stopCameraPreview()
        // 如果希望App切后台后，停止录制主播端的声音，可以在此切换为DummyAudio采集，
        // 该模块会代替mic采集模块产生静音数据，同时释放占用的mic资源
        mStreamer.setUseDummyAudioCapture(true)
    }

    override fun onDestroy() {
        super.onDestroy()
        // 清理相关资源
        mStreamer.release()
    }
}